Inside xenbus_switch_state, don't write the new state if the node has already
authoremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Wed, 23 Nov 2005 18:47:54 +0000 (18:47 +0000)
committeremellor@leeni.uk.xensource.com <emellor@leeni.uk.xensource.com>
Wed, 23 Nov 2005 18:47:54 +0000 (18:47 +0000)
disappeared.  This happens when the driver is being torn down, and we don't
want to resurrect the device directory in the store because of it.

Partially addresses bug #424.

Signed-off-by: Ewan Mellor <ewan@xensource.com>
linux-2.6-xen-sparse/drivers/xen/xenbus/xenbus_client.c

index 869ce26906a743312a3336616310643638c9e799..b28cc76c48a5c2c3e9a019e1947745b52b9f4f1c 100644 (file)
@@ -97,14 +97,17 @@ int xenbus_switch_state(struct xenbus_device *dev,
        /* We check whether the state is currently set to the given value, and
           if not, then the state is set.  We don't want to unconditionally
           write the given state, because we don't want to fire watches
-          unnecessarily.
+          unnecessarily.  Furthermore, if the node has gone, we don't write
+          to it, as the device will be tearing down, and we don't want to
+          resurrect that directory.
         */
 
        int current_state;
 
        int err = xenbus_scanf(xbt, dev->nodename, "state", "%d",
                               &current_state);
-       if (err == 1 && (XenbusState)current_state == state)
+       if ((err == 1 && (XenbusState)current_state == state) ||
+           err == -ENOENT)
                return 0;
 
        err = xenbus_printf(xbt, dev->nodename, "state", "%d", state);